package com.fanyu.test.paper;

import com.alibaba.fastjson.JSONObject;
import com.fanyu.framework.utils.HttpClients4;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 对接机构版 代码演示  (机构版接口提交对接方式)
 *
 * @author Administrator
 */
@RestController
public class OrganDemo {
    /**
     * 由维普提供的userid
     */
    public static final String USER_ID = "******";
    /**
     * 由维普提供的密钥
     */
    public static final String KEY = "******";


    /**
     * 提交论文, 并检测
     */
    public static void main(String[] args) {
        // 第一步: 提交论文
//        String paperId = submitPaper();

        // 第二步: 提交检测, 并扣除次数
//        subCheck("1933440820183400449");

        // 第三步: 获取检测结果, 如果在第二步传递了 callbackurl参数, 无需考虑执行这一步
//        getCheckResult("1933440820183400449");

        //查询剩余次数
//        getCheckCount();
    }


    /**
     * 提交论文
     */
    public static String submitPaper() {
        try {
            //本地文件流
            File file = new File("D:\\ChromeDownload\\测试文章\\1701803+王晶晶+二稿.txt");

            //请求参数
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("userid", USER_ID);
            paramMap.put("sign", getSign());
            paramMap.put("file", file);

            //报告内展示的标题作者
            paramMap.put("title", "养殖流水实验室自动控制器的设计");
            paramMap.put("author", "王晶晶");
            //学号
            paramMap.put("number", "1701803");
            //检测版本 1:研究生版 2:大学生版 3:职称版, 4:编辑部版 (不传默认为2:大学生版)
            paramMap.put("sysid", 2);

            // 发送请求
            HttpClients4 clients4 = new HttpClients4();
            HttpClients4.HttpClientResult hcr = clients4.post("https://vims.fanyu.com/toole/jianceorgan/papersubmit.aspx", null, paramMap, true);

            // 查看返回内容
            JSONObject resJson = JSONObject.parseObject(hcr.getBodyAsString());
            System.out.println("提交论文返回结果：" + resJson);
            String paperId = "";
            if (resJson.getBoolean("success")) {
                //提交成功
                paperId = resJson.getJSONArray("listpaper").getJSONObject(0).getString("paperid");
            }
            else {
                //todo 返回失败处理
                System.out.println(resJson.getString("message"));
            }
            return paperId;
        } catch (Exception e) {
            e.printStackTrace();
            // todo 异常错误处理
            return null;
        }
    }

    /**
     * 提交检测, 并扣除当前userId下的检测次数
     */
    public static void subCheck(String paperIds) {
        try {
            //请求参数
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("userid", USER_ID);
            paramMap.put("sign", getSign());
            //检测版本 1:研究生版 2:大学生版 3:职称版, 4:编辑部版 (不传默认为2:大学生版)
            paramMap.put("sysid", 2);

            //提交论文返回的 论文id, 多个逗号隔开
            paramMap.put("paperids", paperIds);

            //回调地址, 检测成功后, 检测结果会通过此地址返回 (可空)
            paramMap.put("callbackurl", "https://www.baidu.com/myCheckCallBack");

            // 发送请求
            HttpClients4 clients4 = new HttpClients4();
            HttpClients4.HttpClientResult hcr = clients4.post("https://vims.fanyu.com/toole/jianceorgan/paperbegincheck.aspx", paramMap);

            // 查看返回内容
            JSONObject resJson = JSONObject.parseObject(hcr.getBodyAsString());
            System.out.println("提交检测返回结果：" + resJson);
            if (resJson.getBoolean("success")) {
                System.out.println(resJson.getString("message"));
            }
            else {
                //todo 返回失败处理
                System.out.println(resJson.getString("message"));
            }
        } catch (Exception e) {
            e.printStackTrace();
            // todo 异常错误处理
        }
    }


    /**
     * 自定义回调地址, 如果在第二步传递了callbackurl参数, 检测成功后, 检测结果会通过此地址返回
     */
    @RequestMapping("myCheckCallBack")
    @ResponseBody
    public String myCheckCallBack(@RequestBody PaperCallBackInfo dto) throws Exception {
        // todo 查看返回内容, 并处理业务逻辑
        System.out.println(dto);

        //注意, 回推的下载地址和预览地址需要URL解码
        String reportViewUrl = URLDecoder.decode(dto.getPaperviewurl(), "utf-8");
        String reportDownloadUrl = URLDecoder.decode(dto.getPaperdownurl(), "utf-8");

        System.out.println("报告下载地址：" + reportDownloadUrl);
        System.out.println("报告预览地址：" + reportViewUrl);
        System.out.println("全文总相似比：" + dto.getPercentage());

        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return JSONObject.toJSONString(map);
    }

    /**
     * 主动获取检测结果, 如果在第二步传递了callbackurl参数, 无需考虑执行这一步
     */
    public static void getCheckResult(String paperIds) {
        try {
            //请求参数
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("userid", USER_ID);
            paramMap.put("sign", getSign());
            //检测版本 1:研究生版 2:大学生版 3:职称版, 4:编辑部版 (不传默认为2:大学生版)
            paramMap.put("sysid", 2);

            //提交论文返回的 论文id, 多个逗号隔开
            paramMap.put("paperids", paperIds);

            // 发送请求
            HttpClients4 clients4 = new HttpClients4();
            HttpClients4.HttpClientResult hcr = clients4.post("https://vims.fanyu.com/toole/jianceorgan/paperlist.aspx", paramMap);

            // 查看返回内容
            JSONObject resJson = JSONObject.parseObject(hcr.getBodyAsString());
            System.out.println("提交检测返回结果：" + resJson);
            if (resJson.getBoolean("success")) {
                JSONObject paperObj = resJson.getJSONArray("listpaper").getJSONObject(0);

                //检测状态(1:检测中,2:检测完成,3:检测失败,0:未检测)
                Integer checkStatus = paperObj.getInteger("filestateid");
                if (checkStatus == 2) {
                    //todo 检测完成的处理逻辑

                    //报告下载地址
                    String reportDownloadUrl = paperObj.getString("paperdownurl");

                    //报告预览地址
                    String reportViewUrl = paperObj.getString("paperviewurl");

                    //全文总相似比
                    String percentage = paperObj.getString("percentage");


                    System.out.println("报告下载地址：" + reportDownloadUrl);
                    System.out.println("报告预览地址：" + reportViewUrl);
                    System.out.println("全文总相似比：" + percentage);
                }
                else if (checkStatus == 3) {
                    //todo 检测失败的逻辑
                    System.out.println("检测失败的逻辑");
                }
                else if (checkStatus == 1) {
                    //todo 检测中的逻辑, 隔一段时间再主动查询
                    System.out.println("检测中的逻辑，隔一段时间再主动查询");
                }
                else if (checkStatus == 0) {
                    //todo 未检测, 重新发起第二步流程
                    System.out.println("未检测，重新发起第二步流程");
                }

            }
            else {
                //todo 异常处理
                System.out.println(resJson.getString("message"));
            }
        } catch (Exception e) {
            e.printStackTrace();
            // todo 异常错误处理
        }
    }

    /**
     * 生成加密sign
     */
    public static String getSign() {
        String time = new SimpleDateFormat("yyyy-MM-dd HH").format(new Date());
        //MD5加密 生成sign
        String str = USER_ID + KEY + time;
        return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8)).toLowerCase();
    }


    /**
     * 查询检测次数
     */
    public static void getCheckCount() {
        //请求参数
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("userid", USER_ID);
        paramMap.put("sign", getSign());
        //检测版本 1:研究生版 2:大学生版 3:职称版, 4:编辑部版 (不传默认为2:大学生版)
        paramMap.put("sysid", 2);
        //次数类型(1:查重检测次数,2:格式检测次数,3:AIGC检测次数) (不传默认1:查重检测次数)
        paramMap.put("type", 1);

        // 发送请求
        HttpClients4 clients4 = new HttpClients4();
        HttpClients4.HttpClientResult hcr = clients4.post("https://vims.fanyu.com/toole/jianceorgan/papercheckcount.aspx", paramMap);

        // 查看返回内容
        JSONObject resJson = JSONObject.parseObject(hcr.getBodyAsString());
        System.out.println("查询检测次数返回结果：" + resJson);
        if (resJson.getBoolean("success")) {
            //检测次数
            System.out.println("总次数：" + resJson.getInteger("totalcount"));
            System.out.println("剩余次数：" + resJson.getInteger("remaincount"));
            System.out.println("使用次数：" + resJson.getInteger("usecount"));
            System.out.println("到期时间：" + resJson.getString("endtime"));
        }
    }
}
